home *** CD-ROM | disk | FTP | other *** search
- /*
- * getopt.c -- get command-line options.
- */
-
- #include "../h/config.h"
-
- extern char* progname;
-
- /*
- * Based on a public domain implementation of System V
- * getopt(3) by Keith Bostic (keith@seismo), Aug 24, 1984.
- */
-
- #define BadCh (int)'?'
- #define EMSG ""
- #define tell(m) fprintf(stderr,"%s: %s -- %c\n",progname,m,optopt);return BadCh;
-
- int optind = 1; /* index into parent argv vector */
- int optopt; /* character checked for validity */
- char *optarg; /* argument associated with option */
-
- int getopt(nargc,nargv,ostr)
- int nargc;
- char **nargv, *ostr;
- {
- static char *place = EMSG; /* option letter processing */
- register char *oli; /* option letter list index */
- char *index();
-
- if(!*place) { /* update scanning pointer */
- if(optind >= nargc || *(place = nargv[optind]) != '-' || !*++place)
- return(EOF);
- if (*place == '-') { /* found "--" */
- ++optind;
- return(EOF);
- }
- } /* option letter okay? */
- if ((optopt = (int)*place++) == (int)':' || !(oli = index(ostr,optopt))) {
- if(!*place) ++optind;
- tell("illegal option");
- }
- if (*++oli != ':') { /* don't need argument */
- optarg = NULL;
- if (!*place) ++optind;
- }
- else { /* need an argument */
- if (*place) optarg = place; /* no white space */
- else if (nargc <= ++optind) { /* no arg */
- place = EMSG;
- tell("option requires an argument");
- }
- else optarg = nargv[optind]; /* white space */
- place = EMSG;
- ++optind;
- }
- return(optopt); /* dump back option letter */
- }
-